package com.design.patterns.structuralModel.command;

import com.design.patterns.structuralModel.command.service.Command;
import com.design.patterns.structuralModel.command.service.TextEditor;
import com.design.patterns.structuralModel.command.service.impl.CopyCommand;
import com.design.patterns.structuralModel.command.service.impl.PasteCommand;

import java.util.LinkedList;
import java.util.List;

/**
 * 命令模式
 * 目的：将一个请求封装为一个对象，从而使你可用不同的请求对客户进行参数化，对请求排队或记录请求日志，以及支持可撤销的操作。
 */
public class CommandMain {
    public static void main(String[] args) {
        /**
         * 保存命令到list
         */
        LinkedList<String> strings = new LinkedList<>();
        /**
         *
         */
        TextEditor editor = new TextEditor();
        editor.add("测试初始化1\n");
        // 执行一个CopyCommand:
        Command copy = new CopyCommand(editor);
        copy.execute();
        editor.add("------------------以下为copy的------------------\n");
        // 执行一个PasteCommand:
        Command paste = new PasteCommand(editor);
        paste.execute();
        System.out.println(editor.getState());
        /**
         * 这样就可以完成一个有趣的命令模式了
         *
         * 实际上，使用命令模式，确实增加了系统的复杂度。如果需求很简单，那么直接调用显然更直观而且更简单。
         * 那么我们还需要命令模式吗？
         * 答案是视需求而定。如果TextEditor复杂到一定程度，并且需要支持Undo（撤消）、Redo（重做）的功能时，就需要使用命令模式，因为我们可以给每个命令增加undo()：
         */
    }
}
